package com.br.fsm.projectdelivery.fachada;

import java.util.ArrayList;

import android.content.Context;

import com.br.fsm.projectdelivery.basica.Endereco;
import com.br.fsm.projectdelivery.basica.Pedido;
import com.br.fsm.projectdelivery.basica.Produto;
import com.br.fsm.projectdelivery.basica.SugestaoDia;
import com.br.fsm.projectdelivery.basica.Usuario;
import com.br.fsm.projectdelivery.controlador.ControladorBasico;
import com.br.fsm.projectdelivery.controlador.ControladorEndereco;
import com.br.fsm.projectdelivery.controlador.ControladorPedido;
import com.br.fsm.projectdelivery.controlador.ControladorProduto;
import com.br.fsm.projectdelivery.controlador.ControladorSugestaoDia;
import com.br.fsm.projectdelivery.controlador.ControladorUsuario;
import com.br.fsm.projectdelivery.controlador.IControladorEndereco;
import com.br.fsm.projectdelivery.controlador.IControladorPedido;
import com.br.fsm.projectdelivery.controlador.IControladorProdutos;
import com.br.fsm.projectdelivery.controlador.IControladorSugestaoDia;
import com.br.fsm.projectdelivery.controlador.IControladorUsuario;
import com.br.fsm.projectdelivery.excecao.ControladorException;
import com.br.fsm.projectdelivery.excecao.FachadaException;

public class Fachada {
	
	private static Fachada instance;	
	private IControladorUsuario controladorUsuario;
	private IControladorEndereco controladorEndereco;
	private IControladorProdutos controladorProduto;
	private IControladorPedido controladorPedido;
	private IControladorSugestaoDia controladorSugestaoDia;
	
	private Fachada(){
		super();
		controladorUsuario = ( IControladorUsuario ) ControladorUsuario.getInstance();
		controladorEndereco = ( IControladorEndereco ) ControladorEndereco.getInstance();
		controladorProduto = ( IControladorProdutos ) ControladorProduto.getInstance();
		controladorPedido = ( IControladorPedido ) ControladorPedido.getInstance();
		controladorSugestaoDia = ( IControladorSugestaoDia) ControladorSugestaoDia.getInstance();
	}
	
	/**
	 * Padrão de projeto SINGLETON
	 * @author Thúlio Araújo
	 * @return Instancia da Fachada
	 */
	public static Fachada getInstance(){
		if ( instance == null ){
			return  new Fachada();
		} else{
			return instance;
		}
	}
	
	public static void setContext(Context ctx){
		ControladorBasico.getInstance().setContext(ctx);
	}
	
	public Usuario getUsuarioById(int id) throws FachadaException {
		try{
			return controladorUsuario.getUsuarioById( id );
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}
	
	public ArrayList<Usuario> getAllUsuario() throws FachadaException {
		try{
			return controladorUsuario.getAllUsuario();
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void insertUsuario(Usuario usuario) throws FachadaException {
		try{
			controladorUsuario.insertUsuario(usuario);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void updateUsuario(Usuario usuario) throws FachadaException {
		try{
			controladorUsuario.updateUsuario(usuario);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public void removeUsuario(Usuario usuario) throws FachadaException {
		try{
			controladorUsuario.removeUsuario(usuario);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}
	
	
	public Endereco getEnderecoById(int id) throws FachadaException {
		try{
			return controladorEndereco.getEnderecoById( id );
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}
	
	public ArrayList<Endereco> getAllEndereco() throws FachadaException {
		try{
			return controladorEndereco.getAllEndereco();
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void insertEndereco(Endereco usuario) throws FachadaException {
		try{
			controladorEndereco.insertEndereco(usuario);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void updateEndereco(Endereco usuario) throws FachadaException {
		try{
			controladorEndereco.updateEndereco(usuario);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public void removeEndereco(Endereco endereco) throws FachadaException {
		try{
			controladorEndereco.removeEndereco(endereco);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public Produto getProdutoById(int id) throws FachadaException {
		try{
			return controladorProduto.getProdutoById( id );
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}
	
	public ArrayList<Produto> getAllProdutos() throws FachadaException {
		try{
			return controladorProduto.getAllProduto();
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void insertProduto(Produto produto) throws FachadaException {
		try{
			controladorProduto.insertProduto(produto);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void updateProduto(Produto produto) throws FachadaException {
		try{
			controladorProduto.updateProduto(produto);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public void removeProduto(Produto produto) throws FachadaException {
		try{
			controladorProduto.removeProduto(produto);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}
	
	public Pedido getPedidoById(int id) throws FachadaException {
		try{
			return controladorPedido.getPedidoById( id );
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}
	
	public ArrayList<Pedido> getAllPedidos() throws FachadaException {
		try{
			return controladorPedido.getAllPedido();
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void insertPedido(Pedido pedido) throws FachadaException {
		try{
			controladorPedido.insertPedido(pedido);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void updatePedido(Pedido pedido) throws FachadaException {
		try{
			controladorPedido.updatePedido(pedido);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public void removePedido(Pedido pedido) throws FachadaException {
		try{
			controladorPedido.removePedido(pedido);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}
	
	public SugestaoDia getSugestaoDiaById(int id) throws FachadaException {
		try{
			return controladorSugestaoDia.getSugestaoDiaById(id );
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}
	
	public ArrayList<SugestaoDia> getAllSugestaoDias() throws FachadaException {
		try{
			return controladorSugestaoDia.getAllSugestaoDia();
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void insertSugestaoDia(SugestaoDia sugestaoDia) throws FachadaException {
		try{
			controladorSugestaoDia.insertSugestaoDia(sugestaoDia);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}
	}

	public void updateSugestaoDia(SugestaoDia SugestaoDia) throws FachadaException {
		try{
			controladorSugestaoDia.updateSugestaoDia(SugestaoDia);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}

	public void removeSugestaoDia(SugestaoDia sugestaoDia) throws FachadaException {
		try{
			controladorSugestaoDia.removeSugestaoDia(sugestaoDia);
		} catch ( ControladorException e ){
			throw new FachadaException( e.getMessage() );
		}		
	}
}
